package net.tksl.crm.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import net.tksl.crm.controller.view.bean.CuentaBean;
import net.tksl.crm.controller.view.converter.UtilCuentaConverter;
import net.tksl.crm.dao.DatabaseObjectDao;
import net.tksl.crm.dao.bd.CiudadBD;
import net.tksl.crm.dao.bd.CuentaBD;
import net.tksl.crm.dao.bd.DetalleCompendioBD;
import net.tksl.crm.dao.bd.PaisBD;
import net.tksl.crm.service.CuentaService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("cuentaServiceImpl")
public class CuentaServiceImpl implements CuentaService {

	static Logger logger = Logger.getLogger(UsuarioAccesoServiceImpl.class);
	
	@Autowired
	@Qualifier("databaseObjectDaoImpl")
	private DatabaseObjectDao databaseObjectDao;

	@Transactional(readOnly=false,rollbackFor=Exception.class)
	public String registrarCuenta(CuentaBean cuenta) {
		
		CuentaBD cuentaBd = null;

		cuentaBd = databaseObjectDao.load(CuentaBD.class,Integer.parseInt(cuenta.getId()));

		cuentaBd.setNombreCuenta(cuenta.getNombreCuenta());
		
		DetalleCompendioBD tipoCuenta = new DetalleCompendioBD();
		tipoCuenta.setId(Integer.parseInt(cuenta.getIdTipoCuenta()));
		cuentaBd.setTipoCuenta(tipoCuenta);
		
		PaisBD pais = new PaisBD();
		pais.setCodigoPais(cuenta.getCodigoPais());
		cuentaBd.setPais(pais);
		
		CiudadBD ciudad = new CiudadBD();
		ciudad.setId(Integer.parseInt(cuenta.getIdCiudad()));
		cuentaBd.setCiudad(ciudad);

		cuentaBd.setDireccion(cuenta.getDireccion());
		cuentaBd.setEmail(cuenta.getEmail());
		cuentaBd.setTelefono(cuenta.getTelefono());
		cuentaBd.setFax(cuenta.getFax());
		
		String mensajeOperacion = databaseObjectDao.persist(cuentaBd);
		return mensajeOperacion;
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly=true)
	public List<CuentaBean> listarCuentas(Map<String, Object> parametros) {
		
		Integer totalRegistros = databaseObjectDao.obtenerTotalRegistros(CuentaBD.class);
		Integer numFilas = (Integer)parametros.get("numFilas");
		
		Integer totalPaginas = 0;
		if(totalRegistros > 0){
			double d = (((1.0)*totalRegistros)/((1.0)*numFilas));
			totalPaginas = (int)Math.ceil(d);
		}else{
			totalPaginas = 0;
		}
		
		parametros.put("totalRegistros",totalRegistros);
		parametros.put("totalPaginas",totalPaginas);
		
		List<CuentaBD> lstCuentas = (List<CuentaBD>)databaseObjectDao.listarRegistrosPaginados(CuentaBD.class,parametros);
		
		List<CuentaBean> lstCuentasBean = new ArrayList<CuentaBean>();
		if(lstCuentas!=null && lstCuentas.size()>0){
			for(CuentaBD cuentaBD:lstCuentas){
				CuentaBean cuentaBean = UtilCuentaConverter.convertirCuentaBDCuentaBean(cuentaBD);
				lstCuentasBean.add(cuentaBean);
			}
		}
		return lstCuentasBean;
	}
}
